package com.pe.pgn.clubpgn.dao.impl;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.DevolucionClienteDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbAlmacen;
import com.pe.pgn.clubpgn.domain.ClpbClientePersona;
import com.pe.pgn.clubpgn.domain.ClpbDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.ClpbEstacion;
import com.pe.pgn.clubpgn.domain.ClpdArticulo;
import com.pe.pgn.clubpgn.domain.ClpdDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.ClpmCatalogo;
import com.pe.pgn.clubpgn.domain.ClpmTransaccionArticulo;
import com.pe.pgn.clubpgn.domain.ClpmUbigeo;
import com.pe.pgn.clubpgn.domain.ClprPremioCatalogo;
import com.pe.pgn.clubpgn.domain.beans.BNAlmacen;
import com.pe.pgn.clubpgn.domain.beans.BNArticulo;
import com.pe.pgn.clubpgn.domain.beans.BNClientesPersona;
import com.pe.pgn.clubpgn.domain.beans.BNDocumentoDetalle;
import com.pe.pgn.clubpgn.domain.beans.BNDocumentoMovArticulo;
import com.pe.pgn.clubpgn.model.User;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

@Repository("devolucionClienteDao")
public  class DevolucionClienteDaoImpl 
	extends GenericDaoHibernate<ClpbDocumentoMovArticulo, Long> 
	implements DevolucionClienteDao{

	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	public DevolucionClienteDaoImpl(){
		super(ClpbDocumentoMovArticulo.class);
	}
	
	@SuppressWarnings("unchecked")
	public List<BNDocumentoMovArticulo> busquedaCanje(String codeEstacion,
			String codeTarjeta, String daInicioDoc, String daFinDoc, String coCatalogo,
			String nuSerie, String nuDocumento, String deCliente, String codePremio, String stCanje, String stTipoDoc) {

		try{
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, daInicioDoc);
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, daFinDoc);
        }catch(Exception e){
        	//entra aca si el parametro dado no es una fecha
        	daInicioDoc = ""; 
        	daFinDoc 	= "";
        }
        
		String codeAlmacen = "";
		String strFechaDoc = "to_char(cast(" +
		"dma.da_fecha_documento as date),  " +
		"'"+CLPConstantes.DATE_PATTERN+"')";
		
		if (StringUtils.isNotBlank(codeEstacion) && !"-1".equals(codeEstacion))			
		codeAlmacen = obtenerCodigoAlmacenPorEstacion(codeEstacion);
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append("  dma.id ");
		query.append(" ,dma.nu_serie 		 as nuSerie ");
		query.append(" ,dma.nu_documento 	 as nuDocumento ");
		query.append(" ,dma.st_indicador_tipo_documento as stIndicatorTipoDoc ");
		query.append(" ,almacen.de_almacen 	 as deAlmacen   ");
		query.append(" ,estacion.de_estacion as deEstacion  ");		
		query.append(" ,articulo.de_articulo as dePremio    ");
		query.append(" ,catalogo.de_catalogo as deCatalogo  ");
		query.append(" ,"+strFechaDoc+" as daFechaDocumento ");
		query.append(" ,dma.co_cod_tarjeta_persona_canje as codTarjeta ");
		query.append(" ,dma.st_documento_mov_articulo as stDocumentoMovArt ");		
		query.append(" ,cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno as deCliente ");
		
		query.append(" from clpb_documento_mov_articulo dma ");
		query.append(" left join clpd_documento_mov_articulo dtl ");
		query.append(" 		on dtl.co_documento_mov_articulo = dma.id ");
		query.append(" left join clpb_cliente_persona cliente ");
		query.append(" 		on cliente.id = dma.co_cliente_persona ");
		query.append(" inner join clpb_almacen almacen ");
		query.append(" 		on almacen.id = dma.co_almacen ");
		query.append(" inner join clpb_estacion estacion ");
		query.append(" 		on estacion.id = almacen.co_estacion ");
		query.append(" left join clpd_articulo articulo ");
		query.append(" 		on articulo.id = dtl.co_articulo ");
		query.append(" left join clpm_catalogo catalogo ");
		query.append(" 		on catalogo.id = dma.co_catalogo ");
		query.append(" left join clpr_premio_catalogo premcat ");
		query.append(" 		on  premcat.id = dtl.co_premio ");
		query.append(" 		and premcat.co_premio = dtl.co_articulo ");
		
		query.append(" where 1 = 1 ");
		
		if (StringUtils.isNotBlank(codeAlmacen) && !"null".equals(codeAlmacen))
		query.append(" and dma.co_almacen = ").append(codeAlmacen);
		
		if (StringUtils.isNotBlank(codeTarjeta))
		query.append(" and dma.co_cod_tarjeta_persona_canje like ").append("'%"+codeTarjeta+"%'");
		
		if (StringUtils.isNotBlank(daInicioDoc) && StringUtils.isNotBlank(daFinDoc)){
			query.append(" and (dma.da_fecha_documento >= to_date('"+daInicioDoc+"'," +
			"'"+CLPConstantes.DATE_PATTERN+"') and dma.da_fecha_documento <= to_date('"+daFinDoc+"','"+CLPConstantes.DATE_PATTERN+"'))");
		}
		
		if (StringUtils.isNotBlank(coCatalogo) && !"-1".equals(coCatalogo)){
			query.append(" and dma.co_catalogo = ").append(coCatalogo);
			query.append(" and (to_date(to_char(catalogo.da_inicio_vigencia, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
	        "<= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy') ");
			query.append(" and to_date(to_char(catalogo.da_fin_canje, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
	        ">= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy')) ");
		}
		
		if (StringUtils.isNotBlank(nuSerie) && !"-1".equals(nuSerie))
		query.append(" and dma.nu_serie = ").append("'"+nuSerie+"'");
		
		if (StringUtils.isNotBlank(nuDocumento))
		query.append(" and dma.nu_documento like ").append("'%"+nuDocumento+"%'");
		
		if (StringUtils.isNotBlank(deCliente))
		query.append(" and upper(cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno) like upper('%"+deCliente.trim()+"%') ");
		
		if (StringUtils.isNotBlank(codePremio))
		query.append(" and upper(premcat.co_codigo_premio) like upper('%"+codePremio.trim()+"%') ");
		
		if (StringUtils.isNotBlank(stCanje) && !"-1".equals(stCanje))
		query.append(" and dma.st_documento_mov_articulo = ").append("'"+stCanje+"'");
		
		if(CLPConstantes.ST_DOCUMENTO_CANJE.equals(stTipoDoc)){
			query.append(" and dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_CANJE+"'");
		}else if(CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE.equals(stTipoDoc)){
			query.append(" and dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE+"'");
			
		}else{
			query.append(" and (dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_CANJE+"'");
			//query.append(" or dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_RESERVA+"'");
			query.append(" or dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE+"')");
		}
		
		query.append(" group by ");
		query.append(" 	  dma.id ");
		query.append(" 	 ,dma.nu_serie ");
		query.append(" 	 ,dma.nu_documento ");
		query.append("   ,dma.st_indicador_tipo_documento ");
		query.append(" 	 ,almacen.de_almacen ");
		query.append(" 	 ,estacion.de_estacion ");
		query.append(" 	 ,articulo.de_articulo ");
		query.append(" 	 ,catalogo.de_catalogo ");
		query.append(" 	 ,dma.da_fecha_documento ");
		query.append(" 	 ,dma.co_cod_tarjeta_persona_canje ");
		query.append(" 	 ,dma.st_documento_mov_articulo ");
		query.append(" 	 ,cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno ");
		query.append(" order by dma.id desc ");
		
		System.out.println("*** DevolucionClienteDaoImpl.busquedaCanje() --> "+query.toString());
		return findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
	}	
	

	
	@SuppressWarnings("unchecked")
	public List<BNDocumentoMovArticulo> listaDevoluciones() {
		String strFechaDoc = "to_char(cast(" +
		"dma.da_fecha_documento as date),  " +
		"'"+CLPConstantes.DATE_PATTERN+"')";
		
		StringBuffer query = new StringBuffer();
		
		query.append(" select * from (");
		query.append(" select ");
		query.append("  dma.id ");
		query.append(" ,dma.nu_serie 		 as nuSerie ");
		query.append(" ,dma.nu_documento 	 as nuDocumento ");
		query.append(" ,dma.st_indicador_tipo_documento as stIndicatorTipoDoc ");
		query.append(" ,almacen.de_almacen 	 as deAlmacen   ");
		query.append(" ,estacion.de_estacion as deEstacion  ");		
		query.append(" ,articulo.de_articulo as dePremio    ");
		query.append(" ,catalogo.de_catalogo as deCatalogo  ");
		query.append(" ,"+strFechaDoc+" as daFechaDocumento ");
		query.append(" ,dma.co_cod_tarjeta_persona_canje as codTarjeta ");
		query.append(" ,dma.st_documento_mov_articulo as stDocumentoMovArt ");		
		query.append(" ,cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno as deCliente ");
		
		query.append(" from clpb_documento_mov_articulo dma ");
		query.append(" left join clpd_documento_mov_articulo dtl ");
		query.append(" 		on dtl.co_documento_mov_articulo = dma.id ");
		query.append(" left join clpb_cliente_persona cliente ");
		query.append(" 		on cliente.id = dma.co_cliente_persona ");
		query.append(" inner join clpb_almacen almacen ");
		query.append(" 		on almacen.id = dma.co_almacen ");
		query.append(" inner join clpb_estacion estacion ");
		query.append(" 		on estacion.id = almacen.co_estacion ");
		query.append(" left join clpd_articulo articulo ");
		query.append(" 		on articulo.id = dtl.co_articulo ");
		query.append(" left join clpm_catalogo catalogo ");
		query.append(" 		on catalogo.id = dma.co_catalogo ");
		query.append(" left join clpr_premio_catalogo premcat ");
		query.append(" 		on  premcat.id = dtl.co_premio ");
		query.append(" 		and premcat.co_premio = dtl.co_articulo ");
		
		query.append(" where 1 = 1 ");

		query.append(" and dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE+"'");
		
		query.append(" group by ");
		query.append(" 	  dma.id ");
		query.append(" 	 ,dma.nu_serie ");
		query.append(" 	 ,dma.nu_documento ");
		query.append("   ,dma.st_indicador_tipo_documento ");
		query.append(" 	 ,almacen.de_almacen ");
		query.append(" 	 ,estacion.de_estacion ");
		query.append(" 	 ,articulo.de_articulo ");
		query.append(" 	 ,catalogo.de_catalogo ");
		query.append(" 	 ,dma.da_fecha_documento ");
		query.append(" 	 ,dma.co_cod_tarjeta_persona_canje ");
		query.append(" 	 ,dma.st_documento_mov_articulo ");
		query.append(" 	 ,cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno ");
		query.append(" order by dma.id desc ");
		query.append(" ) where rownum <= ").append(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		System.out.println("*** DevolucionClienteDaoImpl.listaDevoluciones() --> "+query.toString());
		return findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
	}

	@SuppressWarnings("unchecked")
	public Map validaStockDisponibleDevolucion(BNDocumentoMovArticulo bndocumento){
		
		List<BNDocumentoDetalle> detalleDevueltoGeneral = obtenerListaDevueltos
		(bndocumento.getId());	
		
		Map map = new HashMap();
		if (bndocumento.getDocumentoDetalle().size() - detalleDevueltoGeneral.size() < bndocumento.getVaCantidad()){
			map.put("msg", "error");
			map.put("detalle", "devolucionclienteform.stockdevolucion");
			return map;
		}
		map.put("msg", "success");	
		return map;
	}
	
	@SuppressWarnings("unchecked")
	public Map guardarDevolucion(BNDocumentoMovArticulo bndocumento) {
		
		System.out.println("entro al guardar devolucion");
		String[] arrayStr = new String[4];
		Map map = new HashMap();
		//se inicia la transaccion para guardar todo el bloque

		try{
			
			User beanUser  = getUsuarioLogueado();
			ClpbEstacion estacion = beanUser.getClpbEstacion();
			
			//frk: si el usuario logueado tiene una estacion relacionada
			//las devoluciones solo se pueden hacer en el mismo lugar donde se hizo el canje
			
			if(estacion != null){
				BNAlmacen bnalmacen = obtenerAlmacenPorEstacion(estacion.getId());
				if(!bnalmacen.getId().toString().equals(bndocumento.getCoAlmacen())){
				
					map.put("msg", "error");
					map.put("detalle", "devolucionclienteForm.error.estaciondiferente");
					return (HashMap)map;
				}				
			}
			
			String codTarjeta  	  = bndocumento.getCodTarjeta();
			String codAlmacen 	  = bndocumento.getCoAlmacen();
			String coCodigoPremio = bndocumento.getCoCodigoPremio();
			String coDepartamento = bndocumento.getCoDepartamento();
			String coProvincia    = bndocumento.getCoProvincia();
			String coDistrito     = bndocumento.getCoDistrito();
			Long vaCantidad 	  = bndocumento.getVaCantidad();
			Long vaPuntosPremio   = bndocumento.getVaPuntosPremio();
			Long vaPuntosTotales  = bndocumento.getVaPuntosTotales();
			BigDecimal vaPrecioPremio = bndocumento.getVaPrecioPremio();
			BigDecimal vaPrecioTotal  = bndocumento.getVaPrecioTotal();			
			
			List<BNDocumentoDetalle> listDtl = bndocumento.getDocumentoDetalle();		
			List<BNDocumentoDetalle> detalleDevueltoGeneral = obtenerListaDevueltos
			(bndocumento.getId());
			
			BNArticulo bnarticulo = obtenerDatosPremioPorCodigo(coCodigoPremio,codAlmacen);
			String stManejaStockPuntoCanje = bnarticulo.getStManejaStockPuntoCanje();
			
			if(bnarticulo.getStManejaSerie().equals("Y") && listDtl.isEmpty()){
				map.put("msg", "error");
				map.put("detalle", "devolucionclienteForm.error.grillaVacia");
				return (HashMap)map;
			}
			
			if(!listDtl.isEmpty() && bnarticulo.getStManejaSerie().equals("Y")){
				if (listDtl.size() - detalleDevueltoGeneral.size() < bndocumento.getVaCantidad()){
					map.put("msg", "error");
					map.put("detalle", "devolucionclienteForm.error.stock.insuficiente");
					return (HashMap)map;
				}
			}					
			
			if(StringUtils.isBlank(bnarticulo.getDeArticulo())){
				map.put("msg", "error");
				map.put("detalle", "devolucionclienteForm.error.codigopremio.invalido");
				return (HashMap)map;
			}

			if(bnarticulo.getStManejaSerie().equals("Y")){
				for (int i = 0; i<detalleDevueltoGeneral.size();i++){
					BNDocumentoDetalle detDevuelto = (BNDocumentoDetalle)detalleDevueltoGeneral.get(i);
					for (int x = 0; x<listDtl.size();x++){
						BNDocumentoDetalle detDevolver = (BNDocumentoDetalle)listDtl.get(i);
						if (detDevolver.getStDevuelve().equalsIgnoreCase("S")){
							if (detDevolver.getCoSerie().equals(detDevuelto.getCoSerie())){
								map.put("msg", "error");
								map.put("detalle", "devolucionclienteForm.error.serie.devuelto");
								return (HashMap)map;								
							}							
						}
					}					
				}
			}

			
			BNClientesPersona beancliente = obtenerDatosClientePorTarjeta(codTarjeta);
			if(StringUtils.isBlank(beancliente.getDeNombre())){
				map.put("msg", "error");
				map.put("detalle", "devolucionclienteForm.error.codigotarjeta.invalido");
				return (HashMap)map;
			}
			
			///////////////////////////////////////////////////////////////////////
			bndocumento.setDeCliente(beancliente.getDeNombre());
			bndocumento.setDePuntosAcumulados(beancliente.getDePuntosAcumulados());
			///////////////////////////////////////////////////////////////////////
						
			
			ClpbAlmacen clpbAlmacen = new ClpbAlmacen();
			clpbAlmacen.setId(new Long(bndocumento.getCoAlmacen()));
			
			ClpdArticulo clpdArticulo = new ClpdArticulo();
			clpdArticulo.setId(new Long(bnarticulo.getCoArticulo()));
			
			ClprPremioCatalogo clprPremio = new ClprPremioCatalogo();
			clprPremio.setId(new Long(bnarticulo.getCoPremio()));
			
			ClpmCatalogo clpmCatalogo = new ClpmCatalogo();
			clpmCatalogo.setId(new Long(bnarticulo.getCoCatalogo()));
			
			ClpbClientePersona clpbClientePersona = new ClpbClientePersona();
			clpbClientePersona.setId(new Long(beancliente.getCoClientePersona()));
			
			ClpmUbigeo clpmUbigeo = null;		
			if(StringUtils.isNotBlank(coDepartamento) &&
			   StringUtils.isNotBlank(coProvincia) &&
			   StringUtils.isNotBlank(coDistrito)){
				
				clpmUbigeo = getUbigeo(coDepartamento,
				coProvincia, coDistrito);
				
				bndocumento.setDeDepartamento(clpmUbigeo.getDeDepartamento());
				bndocumento.setDeProvincia(clpmUbigeo.getDeProvincia());
				bndocumento.setDeDistrito(clpmUbigeo.getDeDistrito());
			}
			
			String nuSerie = bndocumento.getNuSerie();
			String nuDocumento = getNuDocumentoByCoAlmacenTipoDoc(codAlmacen, 
			CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE);
			bndocumento.setNuDocumento(nuDocumento);
			
			//BASE
			ClpbDocumentoMovArticulo objBean = new ClpbDocumentoMovArticulo();
			objBean.setId(null);
			objBean.setDaFecha(Calendar.getInstance());
			objBean.setDaFechaDocumento(Calendar.getInstance());
			objBean.setClpbAlmacen(clpbAlmacen);
			objBean.setClpmCatalogo(clpmCatalogo);
			objBean.setClpbClientePersona(clpbClientePersona);
			objBean.setDeObservaciones(bndocumento.getDeObservacion());
			objBean.setCoCodTarjetaPersonaCanje(bndocumento.getCodTarjeta());
			objBean.setCoCodigoTarjetaPersonaDev(bndocumento.getCodTarjeta());
			objBean.setNuSerie(bndocumento.getNuSerie());
			objBean.setNuDocumento(bndocumento.getNuDocumento());		
			objBean.setCoDocumentoMovCanje(bndocumento.getId());
			objBean.setVaCantidad(new BigDecimal(vaCantidad));
			objBean.setVaPuntosPremio(new BigDecimal(vaPuntosPremio));
			objBean.setVaPuntosTotales(new BigDecimal(vaPuntosTotales));
			objBean.setVaPrecioPremio(vaPrecioPremio);		
			objBean.setVaPrecioTotal(vaPrecioTotal.setScale
			(CLPConstantes.CANTIDAD_DECIMALES, BigDecimal.ROUND_HALF_UP));
			
			objBean.setDeJrAvCa(bndocumento.getDeJrAvCa());
			objBean.setDeDireccion(bndocumento.getDeDireccion());
			objBean.setDeNumero(bndocumento.getDeNumero());
			objBean.setDeMzLote(bndocumento.getDeMzLote());
			objBean.setDeDptoPisoInt(bndocumento.getDeDptoPisoInt());
			objBean.setDeUrbIndResUnVec(bndocumento.getDeUrbIndResUnVec());
			objBean.setDeSecEtapaZona(bndocumento.getDeSecEtapaZona());
			objBean.setClpmUbigeo(clpmUbigeo);			
			
			objBean.setClpdArticulo(clpdArticulo);
			objBean.setClprPremio(clprPremio);
			objBean.setStDocumentoMovArticulo(true);
			objBean.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			objBean.setDaFechaCreacion(Calendar.getInstance());
			
			objBean.setStIndicadorTipoDocumento(CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE);
						
			
			//guardando el registro base
			getHibernateTemplate().saveOrUpdate(objBean);
			
			//DETALLE
			if(bnarticulo.getStManejaSerie().equals("Y")){
				if (!listDtl.isEmpty()){			
					
					for (int y = 0;y < listDtl.size(); y++){
						
						BNDocumentoDetalle beandetalle = (BNDocumentoDetalle)listDtl.get(y);						
						ClpdDocumentoMovArticulo objBeanDetalle = new ClpdDocumentoMovArticulo();
						objBeanDetalle.setClpbDocumento(objBean);
						objBeanDetalle.setClpdArticulo(clpdArticulo);
						objBeanDetalle.setClprPremio(clprPremio);
						objBeanDetalle.setVaCantidad(BigDecimal.ONE);
						objBeanDetalle.setCoSerie(beandetalle.getCoSerie());
						objBeanDetalle.setStDocumentoMovArticulo(Boolean.TRUE);
						objBeanDetalle.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
						objBeanDetalle.setDaFechaCreacion(Calendar.getInstance());
							
						////////////////////////////////////////////////////////////////////////
						
						ClpmTransaccionArticulo clpmTransaccion = new ClpmTransaccionArticulo();
						clpmTransaccion.setClpdArticulo(clpdArticulo);
						clpmTransaccion.setCoCodigoArticulo(bnarticulo.getCoCodigoArticulo());
						clpmTransaccion.setStIndicadorTipoMovimiento(CLPConstantes.DEVOLUCION_DE_PREMIO);
						clpmTransaccion.setVaCantidad(BigDecimal.ONE.negate());
						clpmTransaccion.setClpbAlmacen(clpbAlmacen);
						clpmTransaccion.setClpmCatalogo(clpmCatalogo);
						clpmTransaccion.setClprPremio(clprPremio);
						clpmTransaccion.setCoCodigoPremio(coCodigoPremio);
						clpmTransaccion.setClpbDocumentoMovArticulo(objBean);
						clpmTransaccion.setCoSerie(beandetalle.getCoSerie());
						clpmTransaccion.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
						clpmTransaccion.setDaFechaCreacion(Calendar.getInstance());
						
						if ("S".equals(beandetalle.getStDevuelve())){
							getHibernateTemplate().saveOrUpdate(objBeanDetalle);
							getHibernateTemplate().saveOrUpdate(clpmTransaccion);
						}					
					}
				}
			}else{
				
				for (int i = 0; i < vaCantidad; i++) {
					
					ClpdDocumentoMovArticulo clpdDocumentoMovArticulo = new ClpdDocumentoMovArticulo();
					clpdDocumentoMovArticulo.setClpbDocumento(objBean);
					clpdDocumentoMovArticulo.setClpdArticulo(clpdArticulo);
					clpdDocumentoMovArticulo.setClprPremio(clprPremio);
					clpdDocumentoMovArticulo.setVaCantidad(BigDecimal.ONE);
					clpdDocumentoMovArticulo.setCoSerie(null);
					clpdDocumentoMovArticulo.setStDocumentoMovArticulo(Boolean.TRUE);
					clpdDocumentoMovArticulo.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
					clpdDocumentoMovArticulo.setDaFechaCreacion(Calendar.getInstance());
						
					////////////////////////////////////////////////////////////////////////
					
					ClpmTransaccionArticulo clpmTransaccion = new ClpmTransaccionArticulo();
					clpmTransaccion.setClpdArticulo(clpdArticulo);
					clpmTransaccion.setCoCodigoArticulo(bnarticulo.getCoCodigoArticulo());
					clpmTransaccion.setStIndicadorTipoMovimiento(CLPConstantes.DEVOLUCION_DE_PREMIO);
					clpmTransaccion.setVaCantidad(BigDecimal.ONE.negate());
					clpmTransaccion.setClpbAlmacen(clpbAlmacen);
					clpmTransaccion.setClpmCatalogo(clpmCatalogo);
					clpmTransaccion.setClprPremio(clprPremio);
					clpmTransaccion.setCoCodigoPremio(coCodigoPremio);
					clpmTransaccion.setClpbDocumentoMovArticulo(objBean);
					clpmTransaccion.setCoSerie(null);
					clpmTransaccion.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
					clpmTransaccion.setDaFechaCreacion(Calendar.getInstance());
					
					getHibernateTemplate().saveOrUpdate(clpdDocumentoMovArticulo);
					getHibernateTemplate().saveOrUpdate(clpmTransaccion);
				}
			}
			
			//UPDATES ACTUALIZANDO STOCK DE ARTICULO
			StringBuffer query = new StringBuffer();
			query.append(" update clpd_articulo ");
			query.append(" set ");
			query.append(" 		va_stock_actual = decode(va_stock_actual,null,"+vaCantidad+",va_stock_actual + "+vaCantidad+"),");
			query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
			query.append("		da_fecha_modificacion  = sysdate ");			
			query.append(" where id = ").append(bnarticulo.getCoArticulo());
			arrayStr[0] = query.toString();
			
			//UPDATES PUNTOS DEL CLIENTE
			query = new StringBuffer();
			query.append(" update clpm_puntos_periodo_cliente ");
			query.append(" set ");
			query.append(" 		va_puntos_totales = va_puntos_totales + ").append(vaPuntosTotales).append(",");
			query.append(" 		va_puntos_actuales = va_puntos_actuales +  ").append(vaPuntosTotales).append(",");
			query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
			query.append("		da_fecha_modificacion = sysdate  " );
			query.append(" where co_cliente_persona = ").append(beancliente.getCoClientePersona());
			arrayStr[1] = query.toString();
				
			//STOCK ALMACEN CATALOGO
			long coStockAlmacenCat = Integer.parseInt(bnarticulo.getCoStockAlmacenCatalogo());
			
			query = new StringBuffer();
			query.append(" update clpm_stock_almacen_catalogo ");
			query.append(" set ");
			
			if(CLPConstantes.ST_FALSO.equalsIgnoreCase(stManejaStockPuntoCanje))
			query.append(" 		va_comprometido = decode(va_comprometido,null,"+(-vaCantidad)+",va_comprometido - "+vaCantidad+"),");
			
			query.append(" 		va_cantidad = decode(va_cantidad,null,"+vaCantidad+",va_cantidad + "+vaCantidad+"),");
			query.append(" 		va_stock_catalogo_espejo = decode(va_stock_catalogo_espejo,null,"+vaCantidad+",va_stock_catalogo_espejo + "+vaCantidad+"),");
			query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
			query.append("		da_fecha_modificacion  = sysdate  " );			
			query.append(" where id = ").append(coStockAlmacenCat);
			arrayStr[2] = query.toString();
			

			//UPDATE CANJES LIMITE ESPEJO
			query = new StringBuffer();
			query.append(" update clpr_premio_catalogo ");
			query.append(" set ");
			query.append(" 		va_canjes_limite_espejo  = decode(va_canjes_limite_espejo,null,"+vaCantidad+",va_canjes_limite_espejo + "+vaCantidad+"),");
			query.append(" 		va_stock_catalogo_espejo = decode(va_stock_catalogo_espejo,null,"+vaCantidad+",va_stock_catalogo_espejo + "+vaCantidad+"),");
			query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
			query.append("		da_fecha_modificacion = sysdate ");
			query.append(" where id = ").append(bnarticulo.getCoPremio());
			arrayStr[3] = query.toString();			
			
			/**********************************/
			getHibernateTemplate().flush();
			
			//actualizando el indice del nuDocumento en la tabla clpm_serie_canje
			updateNuDocumentoByCoAlmacenTipoDoc(codAlmacen, CLPConstantes.ST_DOCUMENTO_DEVOLUCION_CLIENTE, 
			nuSerie, nuDocumento);
			
			/**********************************/
			
			jdbcTemplate.batchUpdate(arrayStr);
			
			for (int i = 0; i < arrayStr.length; i++) {
				System.out.println(i+"* update detalle guardarDevolucionCliente(): "+arrayStr[i]);
			}			
			
			map.put("msg", "success");
			bndocumento.setId(objBean.getId());			
			
		}catch(Exception e){
			
			getHibernateTemplate().clear();
			map.put("msg", "error");
			
			System.out.println(e.getMessage());
			log.info(e.getMessage());
		}
		
		return (HashMap)map;
	}

	@SuppressWarnings("unchecked")
	public ClpmUbigeo getUbigeo(String coDepartamento, String coProvincia,
			String coDistrito) {

		Criteria criteria = DetachedCriteria.forClass(ClpmUbigeo.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());
		
		criteria.add(Restrictions.eq("coDepartamento", new Integer(coDepartamento)));
		criteria.add(Restrictions.eq("coProvincia"	 , new Integer(coProvincia)));
		criteria.add(Restrictions.eq("coDistrito"	 , new Integer(coDistrito)));
		criteria.add(Restrictions.eq("stUbigeo"		 , Boolean.TRUE));
	
		List<ClpmUbigeo> lista = criteria.list();
		if(!lista.isEmpty()){
			return (ClpmUbigeo)lista.get(0);
		}else{
			return null;
		}
		
	}
	
	@SuppressWarnings("unchecked")
	public BNArticulo obtenerDatosPremioPorCodigo(String codePremio, String coAlmacen) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 		pc.va_stock_catalogo		as vaStockCatalogoPremioCat, ");
		query.append(" 		pc.va_stock_catalogo_espejo	as vaStockCatalogoEspejoPremioCat, ");		
		query.append(" 		pc.va_canjes_limite			as vaCanjesLimite, ");
		query.append(" 		pc.va_canjes_limite_espejo	as vaCanjesLimiteEspejo, ");
		query.append(" 		pa.va_stock_actual			as vaStockActual, ");
		query.append(" 		pa.va_stock_disponible		as vaStockDisponible, ");
		query.append(" 		pc.id						as coPremio, ");
		query.append(" 		pa.id						as coArticulo, ");
		query.append(" 		pa.de_articulo				as deArticulo, ");
		query.append(" 		pc.co_catalogo				as coCatalogo, ");
		query.append(" 		cat.de_catalogo				as deCatalogo, ");
		query.append(" 		pc.co_codigo_premio			as coCodigoPremio, ");
		query.append(" 		pa.co_codigo_articulo		as coCodigoArticulo, ");
		query.append(" 		ca.de_categoria				as deCategoria, ");
		query.append(" 		dm.de_unidad_medida			as deUnidadMedida, ");
		query.append(" 		pc.va_puntos_requeridos		as vaPuntosRequeridos, ");
		query.append(" 		pc.va_monto_requerido		as vaMontoRequerido, ");
		query.append(" 		pa.st_maneja_serie			as stManejaSerie, ");
		query.append(" 		pa.st_maneja_stock_punto_canje		as stManejaStockPuntoCanje, ");
		query.append(" 		pa.st_maneja_stock_alm_principal	as stManejaStockAlmPrincipal, ");
		query.append(" 		pa.st_no_maneja_stock				as stNoManejaStock, ");
		query.append(" 		sac.id								as coStockAlmacenCatalogo, ");
		query.append(" 		sac.va_cantidad						as vaStockCatalogo, ");
		query.append(" 		sac.va_stock_catalogo				as vaStockCatalogoPremio, ");
		query.append(" 		sac.va_stock_catalogo_espejo		as vaStockCatalogoEspejoPremio, ");
		query.append(" 		sac.va_comprometido					as vaComprometido, ");
		query.append(" 		sac.co_almacen						as coAlmacen, ");
		query.append(" 		alm.st_es_almacen_principal			as stEsAlmacenPrincipal, ");
		query.append(" 		alm.st_es_almacen_virtual			as stEsAlmacenVirtual ");
		
		query.append(" from clpr_premio_catalogo pc ");
		query.append(" inner join clpd_articulo pa ");
		query.append(" 		on pa.id = pc.co_premio ");
		query.append(" inner join clpm_catalogo cat ");
		query.append(" 		on cat.id = pc.co_catalogo ");
		query.append(" inner join clpb_categoria ca ");
		query.append(" 		on ca.id = pa.co_categoria ");
		query.append(" inner join clpd_unidad_medida dm ");
		query.append(" 		on dm.id = pa.co_unidad_medida ");
		query.append(" inner join clpm_stock_almacen_catalogo sac ");
		query.append(" 		on  sac.co_premio = pc.id ");
		query.append(" 		and sac.co_catalogo = pc.co_catalogo ");
		query.append(" inner join clpb_almacen alm ");
		query.append(" 		on alm.id = sac.co_almacen ");
		
		query.append(" where 1 = 1 ");
		query.append(" 		and pc.co_codigo_premio   = '").append(codePremio).append("'");
		query.append(" 		and pc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and pa.st_articulo 		  = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and ca.st_categoria 	  = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and dm.st_unidad_medida   = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and cat.st_catalogo		  = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and alm.st_almacen		  = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		//validando catalogos vigentes
		query.append(" and (to_date(to_char(cat.da_inicio_vigencia, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
        "<= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy') ");
		query.append(" and to_date(to_char(cat.da_fin_canje, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
        ">= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy')) ");
		
		query.append(" group by ");
		query.append(" 		pc.va_stock_catalogo, ");
		query.append(" 		pc.va_stock_catalogo_espejo, ");	
		query.append(" 		pc.va_canjes_limite	, ");
		query.append(" 		pc.va_canjes_limite_espejo, ");
		query.append(" 		pa.va_stock_actual, ");
		query.append(" 		pa.va_stock_disponible, ");
		query.append(" 		pc.id, ");
		query.append(" 		pa.id, ");
		query.append(" 		pa.de_articulo, ");
		query.append(" 		pc.co_catalogo, ");
		query.append(" 		cat.de_catalogo	, ");
		query.append(" 		pc.co_codigo_premio, ");
		query.append(" 		pa.co_codigo_articulo, ");
		query.append(" 		ca.de_categoria	, ");
		query.append(" 		dm.de_unidad_medida, ");
		query.append(" 		pc.va_puntos_requeridos	, ");
		query.append(" 		pc.va_monto_requerido, ");
		query.append(" 		pa.st_maneja_serie	, ");
		query.append(" 		pa.st_maneja_stock_punto_canje, ");
		query.append(" 		pa.st_maneja_stock_alm_principal, ");
		query.append(" 		pa.st_no_maneja_stock, ");
		query.append(" 		sac.id	, ");
		query.append(" 		sac.va_cantidad	, ");
		query.append(" 		sac.va_stock_catalogo, ");
		query.append(" 		sac.va_stock_catalogo_espejo, ");
		query.append(" 		sac.va_comprometido, ");
		query.append(" 		sac.co_almacen, ");
		query.append(" 		alm.st_es_almacen_principal, ");
		query.append(" 		alm.st_es_almacen_virtual ");
		
		System.out.println("**** CanjeDaoImpl.obtenerDatosPremioPorCodigo() --> "+query.toString());
		List<BNArticulo> list = findListOfBeans(query.toString(), null, BNArticulo.class);
		if(!list.isEmpty()){			
			for (BNArticulo bnarticulo2 : list) {					
				if(bnarticulo2.getStManejaStockAlmPrincipal().equals(CLPConstantes.ST_VERDADERO) &&
				   bnarticulo2.getStEsAlmacenPrincipal().equals(CLPConstantes.ST_VERDADERO)){						
					return bnarticulo2;					
				}else if(bnarticulo2.getStManejaStockPuntoCanje().equals(CLPConstantes.ST_VERDADERO) && 
						 bnarticulo2.getCoAlmacen().equals(coAlmacen)){
					return bnarticulo2;
				}else if(bnarticulo2.getStNoManejaStock().equals(CLPConstantes.ST_VERDADERO) &&
					bnarticulo2.getStEsAlmacenVirtual().equals(CLPConstantes.ST_VERDADERO)){
					return bnarticulo2;
				}								
			}							
		}
		
		return new BNArticulo();
	}

	@SuppressWarnings("unchecked")
	public BNDocumentoMovArticulo obtenerDocumento(Long id) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" dma.id as id, ");
		query.append(" cp.id as coCliente , ");
		query.append(" cp.de_nombre||' '|| cp.de_ape_paterno||' '||cp.de_ape_materno as deCliente, ");
		query.append(" to_char(cast(dma.da_fecha_documento  as date), '"+CLPConstantes.DATE_PATTERN+"') as daFechaDocumento, ");
		query.append(" cptos.va_puntos_actuales			as dePuntosAcumulados,  ");	
		query.append(" dma.co_almacen 					as coAlmacen, ");
		query.append(" alm.de_almacen 					as deAlmacen, ");
		query.append(" dma.st_documento_mov_articulo	as stDocumentoMovArt, ");
		query.append(" dma.de_observaciones				as deObservacion, ");
		query.append(" dma.co_cod_tarjeta_persona_canje	as codTarjeta, ");
		query.append(" dma.nu_serie						as nuSerie, ");
		query.append(" dma.nu_documento					as nuDocumento, ");
		query.append(" dma.va_cantidad					as vaCantidad, ");
		query.append(" dma.va_puntos_premio				as vaPuntosPremio, ");
		query.append(" dma.va_puntos_totales			as vaPuntosTotales, ");
		query.append(" dma.va_precio_premio				as vaPrecioPremio, ");
		query.append(" dma.va_precio_total				as vaPrecioTotal, ");
		query.append(" dma.st_direccion					as stDireccion, ");
		query.append(" dma.st_almacen_principal			as stAlmacenPrincipal, ");
		query.append(" dma.st_punto_canje				as stPuntoCanje, ");
		query.append(" dma.de_jr_av_ca					as deJrAvCa, ");
		query.append(" dma.de_direccion					as deDireccion, ");
		query.append(" dma.de_numero					as deNumero, ");
		query.append(" dma.de_mz_lote					as deMzLote, ");
		query.append(" dma.de_dpto_piso_int				as deDptoPisoInt, ");
		query.append(" dma.de_urb_ind_res_un_vec		as deUrbIndResUnVec, ");
		query.append(" dma.de_sec_etapa_zona			as deSecEtapaZona, ");
		query.append(" ub.co_departamento				as coDepartamento, ");
		query.append(" ub.de_departamento				as deDepartamento, ");
		query.append(" ub.co_distrito					as coDistrito, ");
		query.append(" ub.de_distrito					as deDistrito, ");
		query.append(" ub.co_provincia					as coProvincia, ");
		query.append(" ub.de_provincia 					as deProvincia, ");
		query.append(" cpc.co_codigo_premio 			as coCodigoPremio, ");
		query.append(" art.de_articulo 	 				as deCodigoPremio, ");
		query.append(" art.st_maneja_serie				as stManejaSerie, ");
		query.append(" dma.co_articulo		 			as coArticulo, 	");
		query.append(" dma.co_premio					as coPremio, 	");
		query.append(" dma.st_indicador_tipo_documento	as stOperacion, 	");
		query.append(" dma.nu_doc_entrega_reserva		as nuDocEntregaReserva 	");
		
		query.append(" from clpb_documento_mov_articulo dma  ");
		query.append(" inner join clpb_almacen alm  ");
		query.append(" 		on alm.id = dma.co_almacen ");
		query.append(" inner join clpb_tarjeta_persona trj  ");
		query.append(" 		on trj.co_codigo_tarjeta_persona = dma.co_cod_tarjeta_persona_canje ");
		query.append(" inner join clpb_cliente_persona cp  ");
		query.append(" 		on cp.id = trj.co_cliente_persona ");
		query.append(" left join clpm_cliente_puntos cptos ");
		query.append(" 		on cptos.co_cliente_persona = trj.co_cliente_persona ");
		query.append(" left join clpm_ubigeo ub  ");
		query.append(" 		on ub.id = dma.co_ubigeo ");
		query.append(" left join clpr_premio_catalogo cpc  		");
		query.append(" 		on  cpc.id = dma.co_premio");
		query.append(" 		and cpc.co_premio = dma.co_articulo");
		query.append(" left join clpd_articulo art ");
		query.append(" 		on  art.id = dma.co_articulo");
		query.append(" inner join clpr_periodo_acumulacion cpa ");
		query.append(" 		on  cpa.id =cptos.co_periodo_acumulacion ");
		query.append(" where 1 = 1 ");
		query.append(" 	and dma.id = ").append(id);
		query.append(" 	and dma.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and cpa.da_fecha_inicio<=sysdate ");
		query.append(" 		and cpa.da_fecha_vencimiento_puntos>=sysdate ");
		query.append(" 		and cpa.da_fecha_inicio<=cptos.da_fecha_creacion  ");
		query.append(" 		and cpa.da_fecha_vencimiento_puntos>= cptos.da_fecha_creacion ");
		
		System.out.println("*************** obteniendo BASE: "+query.toString());
		List<BNDocumentoMovArticulo> list = findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
		if(!list.isEmpty()){
			
			BNDocumentoMovArticulo bndocumento = 
			(BNDocumentoMovArticulo)list.get(0);
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" 		dta.co_documento_mov_articulo as coDocumento, ");
			query.append(" 		cpc.co_codigo_premio as coCodigoPremio, ");
			query.append(" 		art.de_articulo 	 as deCodigoPremio, ");
			query.append(" 		dta.co_articulo		 as coArticulo, 	");
			query.append(" 		dta.co_premio		 as coPremio, 		");
			query.append(" 		dta.co_serie 		 as coSerie			");
			
			query.append(" from clpd_documento_mov_articulo dta  		");
			query.append(" inner join clpr_premio_catalogo cpc  		");
			query.append(" 		on  cpc.id = dta.co_premio");
			query.append(" 		and cpc.co_premio = dta.co_articulo");
			query.append(" inner join clpd_articulo art ");
			query.append(" 		on  art.id = dta.co_articulo");
			query.append(" where 1 = 1 ");
			query.append(" 	and dta.co_serie is not null ");
			query.append(" 	and dta.co_documento_mov_articulo = ").append(id);
			query.append(" 	and dta.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
			
			System.out.println("*************** obteniendo DETALLE: "+query.toString());
			List<BNDocumentoDetalle> listDetalle = findListOfBeans
			(query.toString(), null, BNDocumentoDetalle.class);	
			
			if(!listDetalle.isEmpty()){				
				bndocumento.setDocumentoDetalle(listDetalle);				
			}			
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" sum(doc.va_cantidad) as cantdevuelta,doc2.va_cantidad as cantidadgeneral ");
			query.append(" from clpb_documento_mov_articulo doc ");
			query.append(" inner join clpb_documento_mov_articulo doc2 ");
			query.append(" on doc2.id = doc.co_documento_mov_canje ");
			query.append(" where doc.co_documento_mov_canje = ").append(bndocumento.getId());
			query.append(" and doc.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" group by doc2.va_cantidad ");
			
			List listMap = findListOfMaps(query.toString(), null);
			if(!listMap.isEmpty()){
				Map map = (HashMap)listMap.get(0);
				Long vaCantDevuelta = new Long(map.get("cantdevuelta").toString());
				Long vaCantGeneral  = new Long(map.get("cantidadgeneral").toString());
				bndocumento.setVaCantRestante(vaCantGeneral - vaCantDevuelta);
			}else{
				bndocumento.setVaCantRestante(bndocumento.getVaCantidad());
			}
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" 		cpc.co_codigo_premio as coCodigoPremio, ");
			query.append(" 		art.de_articulo 	 as deCodigoPremio, ");
			query.append(" 		dta.co_articulo		 as coArticulo, 	");
			query.append(" 		dta.co_premio		 as coPremio, 		");
			query.append(" 		dta.co_serie 		 as coSerie,		");
			query.append(" 		dta.co_documento_mov_articulo as coDocumento		");			
			query.append(" from clpd_documento_mov_articulo dta  		");
			
			query.append(" inner join clpb_documento_mov_articulo documento  ");
			query.append(" 		on  documento.co_documento_mov_canje = dta.co_documento_mov_articulo");			
			query.append(" inner join clpr_premio_catalogo cpc  		");
			query.append(" 		on  cpc.id = dta.co_premio and cpc.co_premio = dta.co_articulo");
			query.append(" inner join clpd_articulo art ");
			query.append(" 		on  art.id = dta.co_articulo");
			query.append(" where 1 = 1 ");
			query.append(" 	and documento.co_documento_mov_canje = ").append(bndocumento.getId());
			query.append(" 	and dta.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
			
			System.out.println("*************** obteniendo DETALLE DEVUELTOS: "+query.toString());
						
			//Detalle de devueltos	
			List<BNDocumentoDetalle> listDetalleDevueltos = findListOfBeans
			(query.toString(), null, BNDocumentoDetalle.class);	
			bndocumento.setDocumentoDetalleDevuelto(listDetalleDevueltos);
						
			return bndocumento;
		}
		
		return new BNDocumentoMovArticulo();
	}

	@SuppressWarnings("unchecked")
	public BNDocumentoMovArticulo obtenerDocumentoDevuelto(Long id) {
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" dma.id, ");
		query.append(" cp.de_nombre||' '|| cp.de_ape_paterno||' '||cp.de_ape_materno as deCliente, ");
		query.append(" to_char(cast(dma.da_fecha_documento  as date), '"+CLPConstantes.DATE_PATTERN+"') as daFechaDocumento, ");
		query.append(" cptos.va_puntos_actuales		 	as dePuntosAcumulados,  ");	
		query.append(" dma.co_almacen 					as coAlmacen, ");
		query.append(" alm.de_almacen 					as deAlmacen, ");
		query.append(" dma.st_documento_mov_articulo	as stDocumentoMovArt, ");
		query.append(" dma.de_observaciones				as deObservacion, ");
		query.append(" dma.co_cod_tarjeta_persona_canje	as codTarjeta, ");
		query.append(" dma.nu_serie						as nuSerie, ");
		query.append(" dma.nu_documento					as nuDocumento, ");
		query.append(" dma.va_cantidad					as vaCantidad, ");
		query.append(" dma.va_puntos_premio				as vaPuntosPremio, ");
		query.append(" dma.va_puntos_totales			as vaPuntosTotales, ");
		query.append(" dma.va_precio_premio				as vaPrecioPremio, ");
		query.append(" dma.va_precio_total				as vaPrecioTotal, ");
		query.append(" dma.st_direccion					as stDireccion, ");
		query.append(" dma.st_almacen_principal			as stAlmacenPrincipal, ");
		query.append(" dma.st_punto_canje				as stPuntoCanje, ");
		query.append(" dma.de_jr_av_ca					as deJrAvCa, ");
		query.append(" dma.de_direccion					as deDireccion, ");
		query.append(" dma.de_numero					as deNumero, ");
		query.append(" dma.de_mz_lote					as deMzLote, ");
		query.append(" dma.de_dpto_piso_int				as deDptoPisoInt, ");
		query.append(" dma.de_urb_ind_res_un_vec		as deUrbIndResUnVec, ");
		query.append(" dma.de_sec_etapa_zona			as deSecEtapaZona, ");
		query.append(" ub.co_departamento				as coDepartamento, ");
		query.append(" ub.de_departamento				as deDepartamento, ");
		query.append(" ub.co_distrito					as coDistrito, ");
		query.append(" ub.de_distrito					as deDistrito, ");
		query.append(" ub.co_provincia					as coProvincia, ");
		query.append(" ub.de_provincia 					as deProvincia ,");
		query.append(" dma.co_premio					as coPremio ,	");
		query.append(" dma.st_indicador_tipo_documento	as stOperaccion ,	");
		query.append(" dma.co_documento_mov_canje	as coDocumentoMovCanje 	");
		query.append(" from clpb_documento_mov_articulo dma  ");
		query.append(" inner join clpb_almacen alm  ");
		query.append(" 		on alm.id = dma.co_almacen ");
		query.append(" inner join clpb_tarjeta_persona trj  ");
		query.append(" 		on trj.co_codigo_tarjeta_persona = dma.co_cod_tarjeta_persona_canje ");
		query.append(" inner join clpb_cliente_persona cp  ");
		query.append(" 		on cp.id = trj.co_cliente_persona ");
		query.append(" left join clpm_puntos_periodo_cliente cptos ");
		query.append(" 		on cptos.co_cliente_persona = trj.co_cliente_persona ");
		query.append(" inner join clpr_periodo_acumulacion cpa ");
		query.append(" 		on  cpa.id =cptos.co_periodo_acumulacion ");
		query.append(" left join clpm_ubigeo ub  ");
		query.append(" 		on ub.id = dma.co_ubigeo ");
		query.append(" where 1 = 1 ");
		query.append(" 	and dma.id = ").append(id);		
		query.append(" 	and dma.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and cpa.da_fecha_inicio<=sysdate ");
		query.append(" 		and cpa.da_fecha_vencimiento_puntos>=sysdate ");
		query.append(" 		and cpa.da_fecha_inicio<=cptos.da_fecha_creacion  ");
		query.append(" 		and cpa.da_fecha_vencimiento_puntos>= cptos.da_fecha_creacion ");
		
		System.out.println("*************** obteniendo BASE: "+query.toString());
		List<BNDocumentoMovArticulo> list = findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
		if(!list.isEmpty()){
			
			BNDocumentoMovArticulo bndocumento = 
			(BNDocumentoMovArticulo)list.get(0);
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" 		cpc.co_codigo_premio as coCodigoPremio, ");
			query.append(" 		art.de_articulo 	 as deCodigoPremio, ");
			query.append(" 		dta.co_articulo		 as coArticulo, 	");
			query.append(" 		dta.co_premio		 as coPremio, 		");
			query.append(" 		dta.co_serie 		 as coSerie,		");
			query.append(" 		dta.co_documento_mov_articulo as coDocumento		");			
			query.append(" from clpd_documento_mov_articulo dta  		");
			query.append(" inner join clpr_premio_catalogo cpc  		");
			query.append(" 		on  cpc.id = dta.co_premio");
			query.append(" 		and cpc.co_premio = dta.co_articulo");
			query.append(" inner join clpd_articulo art ");
			query.append(" 		on  art.id = dta.co_articulo");
			query.append(" where 1 = 1 ");
			query.append(" 	and dta.co_documento_mov_articulo in ").append(bndocumento.getCoDocumentoMovCanje());
			query.append(" 	and dta.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
			
			System.out.println("*************** obteniendo DETALLE: "+query.toString());
			List<BNDocumentoDetalle> listDetalle = findListOfBeans
			(query.toString(), null, BNDocumentoDetalle.class);	
			
			if(!listDetalle.isEmpty()){
				
				BNDocumentoDetalle bndocumentodetalle = 
				(BNDocumentoDetalle)listDetalle.get(0);
				
				bndocumento.setStOperacion(CLPConstantes.ST_DOCUMENTO_CANJE);
				bndocumento.setCoCodigoPremio(bndocumentodetalle.getCoCodigoPremio());
				bndocumento.setDeCodigoPremio(bndocumentodetalle.getDeCodigoPremio());
				bndocumento.setDocumentoDetalle(listDetalle);
				
			}else{
				bndocumento.setStOperacion(CLPConstantes.ST_DOCUMENTO_RESERVA);				
			}

			System.out.println("el bndocumento.getCoDocumentoMovCanje() es:" + bndocumento.getCoDocumentoMovCanje());

			
				
				
				query = new StringBuffer();
				query.append(" select ");
				query.append(" 		cpc.co_codigo_premio as coCodigoPremio, ");
				query.append(" 		art.de_articulo 	 as deCodigoPremio, ");
				query.append(" 		dta.co_articulo		 as coArticulo, 	");
				query.append(" 		dta.co_premio		 as coPremio, 		");
				query.append(" 		dta.co_serie 		 as coSerie,		");
				query.append(" 		dta.co_documento_mov_articulo as coDocumento		");			
				query.append(" from clpd_documento_mov_articulo dta  		");
				query.append(" inner join clpr_premio_catalogo cpc  		");
				query.append(" 		on  cpc.id = dta.co_premio");
				query.append(" 		and cpc.co_premio = dta.co_articulo");
				query.append(" inner join clpd_articulo art ");
				query.append(" 		on  art.id = dta.co_articulo");
				query.append(" where 1 = 1 ");
				query.append(" 	and dta.co_documento_mov_articulo in ").append(bndocumento.getId());
				query.append(" 	and dta.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
				
				System.out.println("*************** obteniendo DETALLE DEVUELTOS: "+query.toString());
				
				//Detalle de devueltos	
				List<BNDocumentoDetalle> listDetalleDevueltos = findListOfBeans
				(query.toString(), null, BNDocumentoDetalle.class);	
				
				if(!listDetalleDevueltos.isEmpty()){					
					bndocumento.setDocumentoDetalleDevuelto(listDetalleDevueltos);
				}
				
			
			
			
			return bndocumento;
		}
		
		return new BNDocumentoMovArticulo();
	}
	
	@SuppressWarnings("unchecked")
	public BNClientesPersona obtenerDatosClientePorTarjeta(String codeTarjeta) {
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" cp.de_nombre||' '|| cp.de_ape_paterno||' '||cp.de_ape_materno as deNombre, ");
		query.append(" cptos.va_puntos_actuales as dePuntosAcumulados,  ");
		query.append(" tp.co_cliente_persona as coClientePersona  ");
		query.append(" from clpb_tarjeta_persona tp ");
		query.append(" inner join clpb_cliente_persona cp ");
		query.append(" 		on cp.id = tp.co_cliente_persona ");
		query.append(" left join clpm_puntos_periodo_cliente cptos ");
		query.append(" 		on cptos.co_cliente_persona = tp.co_cliente_persona ");
		query.append(" inner join clpr_periodo_acumulacion cpa ");
		query.append(" 		on  cpa.id =cptos.co_periodo_acumulacion ");
		query.append(" where 1 = 1 ");
		query.append(" 		and trim(tp.co_codigo_tarjeta_persona) = '").append(codeTarjeta.trim()).append("'");
		query.append(" 		and cpa.da_fecha_inicio<=sysdate ");
		query.append(" 		and cpa.da_fecha_vencimiento_puntos>=sysdate ");
		query.append(" 		and cpa.da_fecha_inicio<=cptos.da_fecha_creacion  ");
		query.append(" 		and cpa.da_fecha_vencimiento_puntos>= cptos.da_fecha_creacion ");
		query.append(" 		and cp.st_cliente_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and tp.st_tarjeta_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		List list = findListOfBeans(query.toString(), null, BNClientesPersona.class);
		if(!list.isEmpty()){
			return (BNClientesPersona)list.get(0);
		}
		
		return new BNClientesPersona();
	}

	@SuppressWarnings("unchecked")
	public BNAlmacen obtenerAlmacenPorEstacion(Long idEstacion) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	 id ");
		query.append(" 	,de_almacen as deAlmacen ");
		query.append(" from clpb_almacen ");
		query.append(" where st_almacen = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and co_estacion = ").append(idEstacion);
		
		List list = findListOfBeans(query.toString(), null, BNAlmacen.class);
		if(!list.isEmpty()){
			return (BNAlmacen)list.get(0);
		}
		
		return null;
	}
	
	@SuppressWarnings("unchecked")
	private String obtenerCodigoAlmacenPorEstacion(String codeEstacion) {

		StringBuffer query = new StringBuffer();
		query.append(" select id ");
		query.append(" from clpb_almacen ");
		query.append(" where co_estacion = ").append(codeEstacion);
		query.append(" and st_almacen = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		List list = findListOfMaps(query.toString(), null);
		if(!list.isEmpty()){
			Map map = (HashMap)list.get(0);
			return String.valueOf(map.get("id"));
		}else{
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<BNDocumentoDetalle> obtenerListaDevueltos(Long id) {
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 		cpc.co_codigo_premio as coCodigoPremio, ");
		query.append(" 		art.de_articulo 	 as deCodigoPremio, ");
		query.append(" 		dta.co_articulo		 as coArticulo, 	");
		query.append(" 		dta.co_premio		 as coPremio, 		");
		query.append(" 		dta.co_serie 		 as coSerie,		");
		query.append(" 		dta.co_documento_mov_articulo as coDocumento		");			
		query.append(" from clpd_documento_mov_articulo dta  		");

		query.append(" inner join clpb_documento_mov_articulo documento  		");
		query.append(" 	on documento.co_documento_mov_canje = ").append(id);
		
		query.append(" inner join clpr_premio_catalogo cpc  		");
		query.append(" 		on  cpc.id = dta.co_premio");
		query.append(" 		and cpc.co_premio = dta.co_articulo");
		query.append(" inner join clpd_articulo art ");
		query.append(" 		on  art.id = dta.co_articulo");
		query.append(" where 1 = 1 ");
		query.append(" 	and dta.co_documento_mov_articulo = documento.id ");
		query.append(" 	and dta.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		System.out.println("*************** obteniendo LISTA DEVUELTOS: "+query.toString());
		
		//Detalle de devueltos	
		List<BNDocumentoDetalle> listDetalleDevueltos = findListOfBeans
		(query.toString(), null, BNDocumentoDetalle.class);	
		
		return listDetalleDevueltos;
	}
	
	@SuppressWarnings("unchecked")
	private String getNuDocumentoByCoAlmacenTipoDoc(String coAlmacen,
			String stTipoDoc) {

		String result = "";
		if(!"-2".equals(coAlmacen) && !"-1".equals(coAlmacen) && StringUtils.isNotBlank(coAlmacen) &&
		   !"-2".equals(stTipoDoc) && !"-1".equals(stTipoDoc) && StringUtils.isNotBlank(stTipoDoc)){
			
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" 	max(co_documento) as co_documento ");
			query.append(" from clpm_serie_canje scj ");
			query.append(" join clpb_almacen alm ");
			query.append(" on alm.co_estacion = scj.co_estacion ");
			query.append(" where scj.st_serie = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and alm.id = ").append(coAlmacen);
			query.append(" and scj.st_indicador_tipo_documento = '").append(stTipoDoc).append("'");
			
			List list = jdbcTemplate.queryForList(query.toString());
			if(ValidationUtil.validateList(list)){
				
				Map objMap = (HashMap)list.get(0);
				String nuDocumento = String.valueOf(objMap.get("co_documento"));
				
				if(nuDocumento.equals("") || nuDocumento.equals("null")){
					result = "1";
				}else{
					result = String.valueOf(Long.parseLong(nuDocumento) + 1);
				}
			}			
		}
		
		return result;
	}
	
	private void updateNuDocumentoByCoAlmacenTipoDoc(String coAlmacen,
			String stTipoDoc, String nuSerie, String nuDocumento) {

		String coEstacion = obtenerCodigoEstacionPorAlmacen(coAlmacen);
		if(StringUtils.isNotBlank(nuDocumento) && StringUtils.isNotBlank(nuSerie) && 
		   StringUtils.isNotBlank(coEstacion)){		
			
			StringBuffer query = new StringBuffer();
			query.append(" update clpm_serie_canje ");
			query.append(" 	set co_documento = ").append(nuDocumento);
			query.append(" where st_serie = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and st_indicador_tipo_documento = '").append(stTipoDoc).append("'");
			query.append(" and co_estacion = ").append(coEstacion);
			query.append(" and de_serie = '").append(nuSerie.trim()).append("'");			
			
			jdbcTemplate.update(query.toString());
		}	
	}
	
	@SuppressWarnings("unchecked")
	private String obtenerCodigoEstacionPorAlmacen(String codeAlmacen) {

		StringBuffer query = new StringBuffer();
		query.append(" select co_estacion ");
		query.append(" from clpb_almacen ");
		query.append(" where id = ").append(codeAlmacen);
		query.append(" and st_almacen = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		List list = findListOfMaps(query.toString(), null);
		if(!list.isEmpty()){
			Map map = (HashMap)list.get(0);
			return String.valueOf(map.get("co_estacion"));
		}else{
			return null;
		}
	}
}
